package com.example.study.ui

/**
 *  created by 20300
 *   on 2022/3/23
 *   describe:https://juejin.cn/post/7044797219878223909
 */
class 自定义LayoutManager {
/*RecyclerView类的注释中对自己的解释:它是一种可以在有限区域内展示大量数据的View.
`RecyclerView的本质是ViewGroup,因此它需要将大量数据对象映射成View对象集合,
    将View对象集合中的View作为自己的子View在自身区域内布局展示
`由于待展示的数据集可能是无限的,所以可能存在一个无限大的View对象集合,但Recycler自身区域有限,
    无法同时在这个区域内展示出所有子View,这意味着它需要提供按需在自身区域内布局出应被展示的子View
    的能力,并通过手势操作替换正在展示的子View的能力,相对应的,在替换展示的View时需要及时回收已经
    不被展示的View对象
`如果数据集合中的大多数据,都可以使用同一种View形态展示出来,则意味着对每一个数据对象都创建一个对应的View是
    浪费的,如果用type来区分数据对象期望的View展示形态,RecyclerView需要拥有根据type安排数据对象复用
    View对象的能力,即同一种type的不同数据对象可以在不同时机复用同一个View对象进行展示

对上述能力,RecyclerView安排不同的类进行处理,依次分别对应:
`Adapter
`LayoutManager
`Recycler
这三个类对RecyclerView来说必不可少,它们是RecyclerView可以正常工作的基础.不过在实际使用过程中,
    Recycler的工作被封装在RecyclerView内部完成,对使用者来说是透明的,同时谷歌提供了几种LayoutManager
    的具体实现类,实现单列表,瀑布流列表等效果,大多时候这种LayoutManager足够满足需求.使用者在日常使用时
    更多地是与Adapter打交道,通过RecyclerView设置自定义的Adapter提供期望展示的子View样式和数据绑定方式.
*/

/*RecyclerView的重要成员
ViewHolder
    如果用Item表示数据集中的一个数据对象,ItemView表示用来展示该Item的View对象.ViewHolder负责在Recycler
    中承载一个ItemView,除了维护View对象本身以外,还维护Item位置(Position,此处的位置是指Item在数据集中的次序),
    item类型,itemId等.大部分时候,Recycler内部或其辅助累并不会直接操作View,而是对ViewHolder进行操作.
    在阅读RecyclerView源码时发现,一些操作需要用View做参数,也有一些操作需要用ViewHolder做参数,
    实际上在Recyclerview中,可以通过任意一样拿到另一样,不必太过纠结Recycler的各个内部类的变量中维护的是哪种类型
    但一般认为Adapter负责根据数据Item创建对应的ViewHolder:recycler负责管理ViewHolder,根据实际情况创建新的
    ViewHolder;LayoutManager可以通过Recycler直接获取到View,负责将其添加到RecyclerView的布局中,并通过Recycler
    回收不被展示的View.
Adapter
    Adapter负责将数据对象映射为View对象.待展示的数据集维护在Adapter内,Adapter除了负责将数据映射为View外,
    也会向外分发数据集中数据的变化
    将数据对象映射为可用来展示的View对象,在RecyclerView体系中被拆为两步:
    `1.根据itemType创建符合预期的ViewHolder对象,此处更关注于View的结构样式
    `2.根据position从Adapter维护的数据集中获取数据对象,将数据对象与ViewHolder中的View进行绑定,
        此处更关注View展示出的数据内容
    在代码实现中,RecyclerView.Adapter基类有两个待使用者实现的回调方法,这两个方法会分别被Adapter.createViewHolder
    和Adapter.bindViewHolder调用,对应着步骤1与步骤2
Recycler
    Recycler负责管理ViewHolder,他可以回收已经不被展示的ViewHolder,并在恰当的时候复用这些ViewHolder.它最重要的
    一个能力就是根据position提供一个ViewHolder/View,使用者无需关心这个ViewHolder是新创建的还是复用已有的,recycler
    帮助RecyclerView处理ViewHolder的缓存.
    缓存有:一级屏幕内缓存,二级屏幕外缓存和一级自定义缓存

View的Detach vs remove
    View被add到parent后,除了可以被remove外,还有更轻量的detach操作,detached表示一种临时状态,意味着这个View在之后会
    马上被重新attach或彻底remove.如果一个View处于detached状态,像被remove一样它也无法通过其parent的getChildAt
    方法获得
Recycler的scrap vs recycle
    相对应的,Recycler对ViewHolder也有两种处理方式:scrap和recycle
    scrap通常和detach操作共同使用,如果使用Recycler对一个View进行Scrap操作,表示期望该View已经处于detach状态(而不是
    removed状态),持有这个View的ViewHolder会被标记为scrap状态,然后临时存放到Recycler.mAttachedScrap列表中,等待
    进一步的处理(unScrap或recycle).scrap是一种临时操作,通常表示该View之前在屏幕中展示,并且之后大概率也会继续展示,
    不希望被remove回收掉.mAttachedScrap是一个ArrayList,存放着没有被remove的子View的ViewHolder

    recycle通常和remove操作共同使用,如果使用Recycler对一个View进行recyle操作,表示期望该View已经从
    其parent中remove掉的View,它之前是被展示在屏幕中的,但由于滑动操作或数据集改变等因素该View不再继续展示,
    此时它可以被回收起来等待复用.这也是本文认为RecyclerView是3级缓存的原因,只有被remove掉的View才有机会被回收缓存
    RecyclerView.Recycler的源码中,有一些方法或变量的命名也与scrap有关,但观察其使用,实际上都在做recycle的工作

缓存与回收
*/
}